/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../config/head.h"
#include "../macro/head.h"
#include "../impl/head.h"
#include "after.h"

namespace xos_gzip
{
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static after::ITEM_DATA xos_item_data;

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

    after::after()
    {
        init_data();
    }

    after::~after()
    {
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // public method

    int after::get_xos_item_data( ITEM_DATA*& item_ptr )
    {
        int ret = 0;
        xos_item_data.set_container( mgr::container() );
        item_ptr = &xos_item_data;
        return ret;
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    http::i_servlet::enumRet after::proc( http::i_task * pTask )
    {
        http::i_servlet::enumRet ret = http::i_servlet::RET_DONE;

        // 
        // 扯蛋代码
        // 
        {
            xos_box::i_string * pStrTime = mgr::container()->box()->string();
            xos::i_time * pTime = mgr::container()->xos()->tm();
            {
                pTime->get_time();
                pTime->get_time_name_ymdhms( pStrTime );
                LOG4( "this is in xos_gzip::after, time = %s", pStrTime->get( 0, 0 ) );
            }
            xos_stl::release_interface( pStrTime );
            xos_stl::release_interface( pTime );
        }

        //
        // 正式压缩
        // 
        const char * lpszDeflate = xos_http_protocol::HTTP_ZIP_DEFLATE;
        http::i_response * pResponse = pTask->http_response();
        xos_box::i_str_property * pTags = pResponse->tags();
        xos_box::i_list * pList = pResponse->body_list();
        xos::i_crt * pCrt = mgr::container()->crt();
        const char * lpszMime = 0;
        bool bDone = false;
        int nBodySize = 0;
        // 如果已经压缩了，就不要再压缩了
        if( !bDone )
        {
            const char * lpszEncode = pTags->str( xos_http_protocol::HTTP_CONTENT_ENCODING );
            if( lpszEncode && ( 0 == pCrt->strcmp( lpszEncode, lpszDeflate ) ) )
            {
                bDone = true;
            }
        }
        // 得到当前内容mime类型
        if( !bDone )
        {
            lpszMime = pTags->str( xos_http_protocol::HTTP_CONTENT_TYPE );
            if( !lpszMime )
            {
                bDone = true;
            }
        }
        // 得到包体大小
        if( !bDone )
        {
            xos_box::i_buf * pBuf = 0;
            for( pList->reset(); ( pBuf = (xos_box::i_buf *)pList->next() ); )
            {
                int nLen = pBuf->get_len( 0 );
                nBodySize += nLen;
            }
            pList->reset();
        }
        // 判断是否需要压缩
        if( !bDone && mgr::container()->http()->if_need_compress_by_mime( lpszMime, nBodySize ) )
        {
            pTags->set( xos_http_protocol::HTTP_CONTENT_ENCODING, lpszDeflate );
            m_pCompress->compress( m_pBodyList, pList );
            m_pBodyList->swap( pList );
        }
        return ret;
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int after::init_data()
    {
        int ret = 0;
        m_pBodyList = 0;
        m_pCompress = 0;
        return ret;
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int after::init()
    {
        int ret = 0;
        m_pCompress = mgr::container()->compress()->zlib();
        m_pBodyList = mgr::container()->box()->list();
        return ret;
    }

    int after::term()
    {
        int ret = 0;
        xos_stl::release_interface( m_pCompress );
        xos_stl::release_interface( m_pBodyList );
        init_data();
        return ret;
    }


} // xos_gzip
